home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
201-225
/
214
/
mandelvroom
/
src
/
mandp.h
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-13
|
16KB
|
605 lines
/*
* MandelVroom 2.0
*
* (c) Copyright 1987,1989 Kevin L. Clague, San Jose, CA
*
* All rights reserved.
*
* Permission is hereby granted to distribute this program's source
* executable, and documentation for non-comercial purposes, so long as the
* copyright notices are not removed from the sources, executable or
* documentation. This program may not be distributed for a profit without
* the express written consent of the author Kevin L. Clague.
*
* This program is not in the public domain.
*
* Fred Fish is expressly granted permission to distribute this program's
* source and executable as part of the "Fred Fish freely redistributable
* Amiga software library."
*
* Permission is expressly granted for this program and it's source to be
* distributed as part of the Amicus Amiga software disks, and the
* First Amiga User Group's Hot Mix disks.
*
* contents: this is the include file for MandelVroom standard includes.
*/
#include <exec/types.h>
#include <exec/lists.h>
#include <exec/nodes.h>
#include <exec/memory.h>
#include <exec/execbase.h>
#include <exec/semaphores.h>
#include <graphics/display.h>
#include <graphics/gfxbase.h>
#include <graphics/gfx.h>
#include <graphics/gfxmacros.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <workbench/startup.h>
#include <workbench/workbench.h>
#include <libraries/dosextens.h>
#include <iff/ilbm.h>
#include <stdio.h>
#include <functions.h>
/**************************************************************************
*
* color cycling stuff
*
*************************************************************************/
#define EXDepth 6 /* Maximum depth (6=HAM) */
#define maxColorReg 32
#define maxCycles 4
#define RNG_NORATE 36 /* Dpaint uses this rate to mean non-active */
#define REVERSE 0x2
typedef struct {
WORD pad1; /* future exp - store 0 here */
WORD rate; /* 60/sec=16384, 30/sec=8192, 1/sec=16384/60=273 */
WORD active; /* lo bit 0=no cycle, 1=yes; next bit 1=rvs */
UBYTE low; /* range lower */
UBYTE high; /* range upper */
} CrngChunk;
/*
* Mandelvroom uses the gadget ID's to decode the meaning of
* gadget related messages. It uses a special encoding to indicate
* what window, and function this gadget is associated with.
*
* I split the gadget id into three fields:
*
* window type - indicates how the window is being used (e.g.
* contour or palette)
*
* gadget type - general classification of gadget within the window
*
* gadget number - in the case of an array of gadgets (like the pens
* in the color palette) this is the array index.
*/
/*
* This defines the bit positions of the fields within the gadget ID
*/
#define WINDTYPEBITS 11
#define TYPEBITS 6
/*
* These masks are used for extracting the fields from gadgetIDs
* when messages are received.
*/
#define WINDMASK 0xffff
#define TYPEMASK 0xf
#define NUMMASK 0x3f
#define WIND_TYPE(g) ((g) >> WINDTYPEBITS & WINDMASK)
#define GADG_TYPE(g) ((g) >> TYPEBITS & TYPEMASK)
#define GADG_NUM(g) ((g) & NUMMASK)
#define CNT_NUM(a) ((a)==CONTLAST ? NUMCONTS-1 : (a)+FirstContour)
/*
* These are the window types
*/
#define PALTYPE 0 /* gadgetID indicates palette gadget */
#define CONTYPE 1 /* gadgetID indicates contour gadget */
#define PICTTYPE 2 /* gadgetID indicates picture gadget */
#define HELPTYPE 3 /* gadgetID indicates help gadget */
#define CYCTYPE 4 /* gadgetID indicates color cycling gadget */
#define ORBTTYPE 5 /* gadgetID indicates orbit gadget */
/*
* These are the general classifications for palette gadgets
*/
#define PALPENS 0 /* pen gadget in the palette */
#define PALPOTS 1 /* Red, Green, Blue potentiometer gadgets */
#define PALCNTLS 2 /* Controls (commands like copy, blend, exchange) */
/*
* Basis for individual ID expansion
*/
#define PALPEN (PALTYPE << WINDTYPEBITS | PALPENS << TYPEBITS)
#define PALPOT (PALTYPE << WINDTYPEBITS | PALPOTS << TYPEBITS)
#define PALCNTL (PALTYPE << WINDTYPEBITS | PALCNTLS << TYPEBITS)
/*
* These are the IDs for the command gadgets
*/
#define PALCOPY (PALCNTL | 0)
#define PALRANGE (PALCNTL | 1)
#define PALEXCG (PALCNTL | 2)
/*
* Now we define the contour gadget IDs
*
* Start with the gadget types
*/
#define CONTSELS 0 /* Contour window Pens */
#define CONTUPS 1 /* Contour window increment gadget */
#define CONTDOWNS 2 /* Contour window decrement gadget */
#define CONTPOTS 3 /* Contour window potentiometer gadget */
#define CONTCNTLS 4 /* Contour window controls */
/*
* Shift everything over so we can or in the specifics
*/
#define CONTSEL (CONTYPE << WINDTYPEBITS | CONTSELS << TYPEBITS)
#define CONTUP (CONTYPE << WINDTYPEBITS | CONTUPS << TYPEBITS)
#define CONTDOWN (CONTYPE << WINDTYPEBITS | CONTDOWNS << TYPEBITS)
#define CONTPOT (CONTYPE << WINDTYPEBITS | CONTPOTS << TYPEBITS)
#define CONTCNTL (CONTYPE << WINDTYPEBITS | CONTCNTLS << TYPEBITS)
#define CONTLAST (CONTSEL | 32)
/*
* Make up the command gadgets IDs for the contour window
*/
#define CONTRECOL (CONTCNTL | 0)
#define CONTSET (CONTCNTL | 1)
#define CONTSMTH (CONTCNTL | 2)
#define CONTCUT (CONTCNTL | 3)
#define CONTCOPY (CONTCNTL | 4)
#define CONTPASTE (CONTCNTL | 5)
#define CONTCEIL (CONTCNTL | 9)
#define CONTBAR (CONTCNTL | 10)
/*
* Shift everything over so we can or in the specifics
*/
#define PICTCUR (PICTTYPE << WINDTYPEBITS | 0)
#define PICTGEN (PICTTYPE << WINDTYPEBITS | 1)
#define PICTIN (PICTTYPE << WINDTYPEBITS | 2)
#define PICTOUT (PICTTYPE << WINDTYPEBITS | 3)
#define PICTJULIA (PICTTYPE << WINDTYPEBITS | 4)
#define HELPUP (HELPTYPE << WINDTYPEBITS | 0)
#define HELPDOWN (HELPTYPE << WINDTYPEBITS | 1)
#define HELPSCROLL (HELPTYPE << WINDTYPEBITS | 2)
/*
* These are the general classifications for cycle gadgets
*/
#define CYCRNUMS 0 /* cycle range indicators */
#define CYCCNTLS 1 /* Controls (Range changer, direction, and speed) */
/*
* Basis for individual ID expansion
*/
#define CYCRNUM (CYCTYPE << WINDTYPEBITS | CYCRNUMS << TYPEBITS)
#define CYCCNTL (CYCTYPE << WINDTYPEBITS | CYCCNTLS << TYPEBITS)
/*
* These are the IDs for the command gadgets
*/
#define CYCRANGE (CYCCNTL | 0)
#define CYCDIR (CYCCNTL | 1)
#define CYCSPEED (CYCCNTL | 2)
#define CYCON (CYCCNTL | 3)
#define ORBTCNTLS 0 /* controls (go into orbit mode) */
#define ORBTMODE (ORBTCNTLS | 0)
/*
* Now for some miscelaneous definitions
*
* Define the number of contours the system allows.
*/
#define NUMCONTS 256 /* This is total number of contours */
#define DISPCONTS 32 /* This is how many are displayable */
#define VERSION 200
/*
* These definitions help us identify menu item selections.
*/
/* Menu Project's, Items */
#define NEWITEM 0
#define CURITEM 1
#define LOADITEM 2
#define SAVEPROJ 3
#define CLOSEPROJ 4
#define SAVEILBM 5
#define HELPITEM 6
#define CANCELITEM 7
#define QUITITEM 8
/* Display Menu's Items */
#define COLORITEM 0
#define CYCLEITEM 1
#define CONTOURITEM 2
#define AUTOCNTRITEM 3
#define HISTOGRAMITEM 4
#define BORDERITEM 5
#define DEPTHITEM 6
#define VIEWMODEITEM 7
#define SCREENITEM 8
/* Menu: Edit, Item: ViewMode's, SubItems */
#define HIRESSUB 0
#define INTERLACESUB 1
#define HALFBRITESUB 2
/* Menu: Edit, Item: Depth's, SubItems */
#define BITPLANE1SUB 0
#define BITPLANES2SUB 1
#define BITPLANES3SUB 2
#define BITPLANES4SUB 3
#define BITPLANES5SUB 4
#define BITPLANES6SUB 5
/* Menu: Edit, Item: Screen's SubItem */
#define WBENCHSUB 0
#define STANDARD 1
/* Calculate Menu's Items */
#define GENERATEITEM 0
#define ZOOMITEM 1
#define SCROLLITEM 2
#define LENSITEM 3
#define GENERATORITEM 4
#define COUNTITEM 5
#define STATSITEM 6
/* Menu: Edit, Item: ZoomIn's, SubItems */
#define ZOOMIN 0
#define ZOOMOUT 1
#define ZOOMOFF 2
#define ZOOMJULIA 3
/* Menu: Project, Item: Generate SubItems */
#define STARTGEN 0
#define STOPGEN 1
#define CONTGEN 2
/* Menu: Project, Item: Scroll SubItems */
#define SETSCROLL 0
#define GENSCROLL 1
#define CANCELSCROLL 2
/* Menu: Edit, Item: Generator, SubItems */
#define INTGENERATOR 0
#define FLOATGENERATOR 1
#define IEEEGENERATOR 2
#define INTIIGENERATOR 3
#define _81GENERATOR 4
/* Special Menu's Items */
#define PRESETITEM 0
#define ORBITITEM 1
#define ORBITMATHITEM 2
#define MAXORBITEM 3
/* Menu: Special, Item: OrbitMode, subitems */
#define INTORBIT 0
#define FFPORBIT 1
#define IEEEORBIT 2
/* Menu Entries */
#define PROJECTMENU 0
#define DISPLAYMENU 1
#define CALCULATEMENU 2
#define SPECIALMENU 3
#define TOGGLED11 0x0200
/* State definitions */
#define COPYRIGHTSTATE 0
#define IDLESTATE 1
#define COPYRGBSTATE 2
#define SPREADRGBSTATE 3
#define XCHGRGBSTATE 4
#define SLIDERGBSTATE 5
#define SETHEIGHTSTATE 6
#define SETCONTSTATE 7
#define SMOOTHCONTSTATE 8
#define CUTCONTSTATE 9
#define COPYCONTSTATE 10
#define PASTECONTSTATE 11
#define CEILINGSTATE 12
#define SLIDEBARSTATE 13
#define ORBITSTATE 14
#define ZOOMINSTATE 15
#define RESIZEZOOMSTATE 16
#define PROPRESIZESTATE 17
#define ZOOMDRAGSTATE 18
#define QUERYHEIGHTSTATE 19
#define SETJULIASTATE 20
#define SLIDESPEEDSTATE 21
#define CYCLERANGESTATE 22
#define HELPSTATE 23
#define SCROLLHELPSTATE 24
#define SCROLLPICTSTATE 25
#define PARSEOK 0
#define PARSEBAD 1
#define ZOOMCLOSEHIT 0
#define ZOOMDRAGHIT 1
#define ZOOMRESIZEHIT 2
#define PROPRESIZEHIT 3
#define NOTHINGHIT 4
/***************************************************************************
*
* Structure for Mandelbrot and Julia Pictures
*
**************************************************************************/
struct Rect {
int Left, Top, Right, Bot;
};
struct Picture {
struct Node pNode; /* for a linked list of pictures */
struct List zList; /* Pictures that have zoom */
/* open in this picture */
struct Node zNode; /* Used to maintain the above */
struct Picture *DrawPict; /* Picture that zoom box is in */
UBYTE ZoomType; /* Zoom In or Out */
int NavTop, NavBot; /* Zoom box location and size */
int NavLeft, NavRight;
struct NewWindow *NewWind; /* NewWindow structure */
struct Window *Window; /* Open Intuition window */
struct RastPort ScrollRp; /* rastport for saved image during scroll */
struct BitMap ScrollBitMap; /* bitmap for saved image */
/* Window origin for scroll*/
struct Rect ImageLoc; /* Scroll's image location in Pict->Window*/
struct Rect ClipImage; /* location after clipping to Window */
struct Rect DataClip; /* clipping also reflected in data */
struct Gadget *SizingGadget; /* sizing place */
/* Sempahore for window */
struct SignalSemaphore WindowSemi;
struct Gadget *Gadgets;
char Title[40]; /* Window Title */
SHORT *Counts; /* Pointer to data area. One */
LONG CountsSize; /* SHORT per pixel. */
/* CountX * CountY * sizeof( SHORT ) */
ULONG Flags; /* Flags regarding Picture specifics */
int LeftMarg, TopMarg;
int RightMarg, BotMarg;
struct Task *gTask; /* Task that generates this */
LONG gSigBit, gSigMask; /* Signal to free up paused tasks */
UBYTE GenState; /* Task state */
UBYTE GenChildState; /* Task state */
int CurLine; /* Index of Line generator is on */
struct Task *cTask; /* Task for Recolor Slow */
UBYTE ColorState; /* Task state */
UBYTE ColorChildState; /* Task state */
struct Histogram *Hist; /* Projects Histogram structure */
SHORT OldMaxIter; /* used for recalc */
LONG TimeStamp[3]; /* Time stamp for calculation */
/***********************************************************/
double Real, Imag; /* For Julia only (Julia Seed) */
/* Set it to 0.0 for Mand */
double RealLow, ImagLow; /* Screen Boundaries for Julia */
double RealHigh, ImagHigh; /* Complex Plane Origin for Mand */
double RealGap, ImagGap; /* Real and Imaginary parts of */
SHORT LeftEdge, TopEdge; /* Window position on screen */
SHORT CountX, CountY; /* Picture dimensions */
SHORT MaxIteration;
UBYTE MathMode; /* Int32, FFP, IEEE */
SHORT Heights[256]; /* Contours' heights and pens */
UBYTE Pens[256];
UBYTE ClrXlate[1024]; /* There are MaxIteration entries */
SHORT RGBs[32]; /* Red, Green, Blue values */
USHORT ViewModes;
SHORT Depth;
SHORT CycleOn; /* Color Cycling stuff */
CrngChunk Crngs[maxCycles];
};
/* Picture.Types */
#define JULIAPICT 1
#define MANDPICT 2
/* Picture Flags */
#define NO_RAM_GENERATE 0x00000001
#define LENS_DISPLAYED 0x00000002
#define ZOOM_BOX_OPEN 0x00000004
#define SCROLL_HAPPENED 0x00000008
#define PROJECT_CHANGED 0x00000010
#define BORDERLESS_PROJ 0x00000020
#define GENPENDSTATE 1
#define CONTINUESTATE 2
#define GENERATESTATE 3
#define PAUSESTATE 4
#define FINISHEDSTATE 5
#define KILLSTATE 6
#define RECOLORINCOMPLETE 0
#define RECOLORCOMPLETE 1
#define GENINCOMPLETE 0
#define GENCOMPLETE 1
#define NOSIGSTATE 2
#define INT1632MATH 0
#define FFPMATH 1
#define IEEEMATH 2
#define INT3232MATH 3
#define M68881MATH 4
#define INTORBMATH 0
#define FFPORBMATH 1
#define IEEEORBMATH 2
/***************************************************************************
*
* External variables
*
**************************************************************************/
/* These are global system variables */
extern struct Picture *CurPict;
extern int CurContour;
extern SHORT NumContours;
extern LONG TopMarg, BotMarg, LeftMarg, RightMarg;
extern struct Screen *screen;
extern struct ViewPort *vp;
extern int Num_vp_Colors;
extern struct Window *PalWind, *ContWind, *StatsWind, *HelpWind;
extern struct Window *HistWind,*CycWind, *OrbitWind;
extern struct Window *CurWind, *CurPlot, *ClosedWind, *BackWind;
extern struct Menu Menu[];
extern SHORT XScale, YScale;
extern SHORT MouseX, MouseY;
extern LONG CurPen;
extern UBYTE ClosePlot;
extern UBYTE QuitScreen;
extern LONG mSigBit,mSigMask;
extern struct Task *mTask;
extern BYTE FromWB;
extern BYTE State, SubState, Parse_rc;
struct Window *OpenMyWind();
struct Gadget *MakeBool(), *MakePot(), *MakeString();
struct IntuiText *MakeIntui(), *ShadowIntui();
struct Border *ShadowBorder();
#define AddSemaphore myAddSemaphore
/*
* Picture window ( Julia and Mandlebrot windows ) margins
*/
#define TOPMARG TopMarg
#define BOTMARG BotMarg
#define LEFTMARG LeftMarg
#define RIGHTMARG RightMarg
#define SUCCESSFUL 0
#define UNSUCCESSFUL -1
#define ChildPause(Pict) {if(Pict->GenState==PAUSESTATE)ChildSignal(Pict);}
/**************************************************************************
*
* Histogram stuff
*
*************************************************************************/
struct Histogram {
int *Table;
int TableSize;
};
#define AllocHistStruct() (struct Histogram *)safeAllocMem(sizeof(struct Histogram), MEMF_CLEAR)
#define FreeHistStruct(p) FreeMem(p,sizeof(struct Histogram))
#define AllocHistTable(s) (int *)safeAllocMem(s*sizeof(int), MEMF_CLEAR)
#define FreeHistTable(p) FreeMem(p->Table,p->TableSize*sizeof(int))
#define AddHead(List,Node) safeAddHead(List,Node,__FILE__,__LINE__,__FUNC__)
#define Remove(Node) safeRemove(Node,__FILE__,__LINE__,__FUNC__)
/**************************************************************************
*
* standard stuff
*
*************************************************************************/
#define BEVELEDUP 0
#define BEVELEDDOWN 1
#define NORMALPEN 1
#define SHADOWPEN 3
#define MEDIUMPEN 2
#define HIGHLIGHTPEN 2
#define POTPEN 3
#ifdef MEM_DEBUG
#include "safeallocmem.h"
#else
APTR safeAllocMem();
#endif